package com.whf.security.browser;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * 该类根据传递进来的用户名获取用户详细信息
 * 姓名+密码+账户状态+权限
 * 如果不是想该类security会自动默认实现账号为user,密码是随即改变的
 */
@Component
public class MyUserDetailsService implements UserDetailsService{


    //注入密码加密器
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        //TODO
        /**查询数据库获取user信息.然后将数据信息封装进UserDetails接口实现类
            传递进去的密码security会自动与传递进来的进行对比
            这儿security提供了实现好的类,参数:用户名+密码+权限(前面两个可以实现认证,最后一个实现授权)
            AuthorityUtils.commaSeparatedStringToAuthorityList("admin")
            该工具可以将以,隔开的字符串转成需要的权限集合格式
         /*return new User(userName,
         /*"123456",
         /*AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
         */


        /**
         * UserDetails接口还提供了4个方法,可以进行账户权限验证
         *  可用,没过期,密码没过期,账户没被锁定
         */
        String pw=passwordEncoder.encode("123456");
        return new User(userName, pw,
                true,true,true,true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}
